import socket
import os


def response_server():
    # ip类型（这里为ipv4）
    # 传输协议（这里是TCP）
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 设置端口号复用，服务端程序退出立即释放端口
    # 参数1:表示当前套接字
    # 参数2:设置端口号复用选项
    # 参数3:设置端口号复用选项对应的值
    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    # 绑定端口号，第一个参数是ip地址，由于可能存在多个网卡，这里不指定，表示本机所有ip(传入的是一个元组)
    server_socket.bind(('', 9000))
    # 设置监听 128表示等待建立连接的最大个数
    server_socket.listen(128)
    while True:
        # 等待于客户端建立连接
        # 返回一个元组（客户端的socket,客户端IP和端口号）
        # 每当客户端和服务端建立连接成功后会返回一个新的socket
        # server_socket只负责与客户端建立连接，接收和发送客户端数据使用新的socket
        new_socket, ip_port = server_socket.accept()
        print('新的socket：', new_socket)
        print('建立连接的IP和端口号为：', ip_port)
        # 接收客户端数据
        # 1024: 每次接收的最大字节数（当客户端断开时，接收到一个长度为0的数据）
        recv_message = new_socket.recv(10240)
        # 判断接收的长度是否为0
        if len(recv_message) <= 0:
            new_socket.close()
            return
        # 解码
        # print('接收到的数据为：', recv_message.decode())
        # 切割接收到的数据 GET /favicon.ico HTTP/1.1 2表示按照‘’切割两次
        response_path = recv_message.decode().split(' ', 2)[1]
        if response_path == '/':
            response_path = '/index.html'

        # 判断问价是否存在
        # 1.os
        # os.path.exists(response_path)
        # try
        try:
            # print('跳转的页面', recv_message.decode().split(' ', 2)[1])
            # 发送数据(http格式数据)
            # 读取文件消息（with open 使得关闭文件步骤由系统来帮我们完成）
            with open('static' + response_path, 'rb') as file:
                file_data = file.read()
        except Exception as e:
            with open('static/error.html', 'rb') as file:
                error_data = file.read()
            # 返回404
            # 响应行
            response_hang = 'HTTP/1.1 404 Not Found\r\n'
            # 响应头
            response_head = 'BWS/1.1\r\n'
            # 空行
            # 响应体
            response_body = error_data
            response = (response_hang + response_head + '\r\n').encode('utf-8') + response_body
            new_socket.send(response)
        else:
            # 响应行
            response_hang = 'HTTP/1.0 200 OK\r\n'
            # 响应头
            response_head = 'BWS/1.1\r\n'
            # 空行
            # 响应体
            response_body = file_data
            response = (response_hang + response_head + '\r\n').encode('utf-8') + response_body
            new_socket.send(response)
        finally:
            # 关闭连接
            # 通话结束
            new_socket.close()
            # 不再接收新的请求，但已建立的请求还能正常通信
            # server_socket.close()


if __name__ == '__main__':
    response_server()
